class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        if (nums.size() == 0) {
            return 0;
        }
        int minsum = nums[0];
        int maxsum = nums[0];
        int maxcur = nums[0];
        int mincur = nums[0];
        int num = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            // 数组的和
            num += nums[i];
            // 判断当前位置的值和加上了前缀和的值谁小
            mincur = min(nums[i], mincur + nums[i]);
            // 判断当前位置的值和加上了前缀和的值谁大
            maxcur = max(nums[i], maxcur + nums[i]);
            // 数组的最大前缀和
            maxsum = max(maxsum, maxcur);
            // 数组的最小前缀和
            minsum = min(minsum, mincur);
        }
        // 当最大前缀和小于0时返回最大值
        if (maxsum < 0) {
            return maxsum;
        }
        // 判断不跨越数组的最大值和跨越数组的最大值
        return max(maxsum, num - minsum);
    }
};